//
//  LWUserAccountViewModel.swift
//  LW_Weibo
//
//  Created by 刘伟 on 16/7/12.
//  Copyright © 2016年 LWSpro. All rights reserved.
//

import UIKit

class LWUserAccountViewModel: NSObject {

    
    //MARK: - 单例
    static let sharedUserAccount: LWUserAccountViewModel = LWUserAccountViewModel()
    
    //为防止在外界直接通过init来创建  在这里将init方法重写 并且定义成私有
    private override init() {
        
        super.init()
        
    }
    
    
    
    //为了让LWMainTabBarController 知道是否登录了  我们需要通过登录成功时,获取到的令牌access_token 来判断isLogin的值
    //登录成功时我们获取到的access_token存入到沙盒中了 所以我们只需要从沙盒中取值就行  如果没登录成  那么沙盒中自然没有值 那么也就登录失败了
    var userAccount: LWUserAccount? { //给只读属性赋值 与懒加载不同的是,每次调用都会走大括号内的代码
        
        return LWUserAccount.loadUserAccount()
        
    }
    
    
    var access_token: String? {
        
        //判断从userAccount的沙盒里面取的值是否是nil  如果是 那么就返回nil  这样isLogin = false
        guard let token = userAccount?.access_token else {
            
            return nil
            
        }
        
        
        //到这里  token绝对有值  并且是userAccount?.access_token 解包完毕的值
        
        //到这里userAccount?.access_token 是有值的
        //再判断是否过期 过期那么就说明登录权限已经没有了  也就是登录失败
        //如果过期时间大于当前时间 那么就没有过期 否则就过期
        //        NSDate() 当前时间
        //这表示过期时间和当前时间比较  比较有个一结果
        let result = userAccount?.expiresDate?.compare(NSDate())
        
        //降序   就表示过期时间大于当前时间
        if result == NSComparisonResult.OrderedDescending {
            
//            print(token)
            
            return token
            
        }else {
            
            return nil
        }
        
    }
    
    
    var isLogin: Bool {
        
        return access_token != nil
        
    }
    
    
    
    
    //MARK: - 通过授权码获取access_token
    // 同时登录成功与否需要告诉外面
    func requestAccesstoken(code: String, successBack:(isSuccess: Bool) -> ()) {
        
        //发送网络请求  获取access_token
        LWNetworkTools.sharedTools.ruquestAccesstoken(code) { (response, error) -> () in
            
            
            if error != nil {//失败了
                
                successBack(isSuccess: false)
                
                print(error)
                
                return
                
            }
            
            //  代码执行到这里  说明请求成功  并且放回了数据
            guard let dic = response as? [String : AnyObject] else { //类型强转 转成字典  as? 就已经做了判断 如果转成失败 那么就不转化
                
                print("这不是一个正确的json格式,不然就能解包了")
                successBack(isSuccess: false)
                
                return
                
            }
            
            //代码到这里  dic一定有值 并且是由网络传回来的数据解包并转换成的字典类型
            
            //获取到的值  转换成模型
            let userAccount = LWUserAccount(dic: dic)
            
            //userAccount 里面已经获取到了 access_token 和 uid
            
            //通过userAccount.access_token 和 uid 获取用户信息
            //调用方法 是在闭包内 所以需要加上self  没有引用循环
            //同样 我们要知道获取用户信息是否成功
            self.requestUserInfo(userAccount, successBack:successBack)
            
            
        }
        
        
    }
    
    
    
    //MARK: - 获取用户信息
    private func requestUserInfo(userAccount: LWUserAccount, successBack:(isSuccess: Bool) -> ()) {
        
        
        //发送网络请求
        LWNetworkTools.sharedTools.requestUserInfo(userAccount) { (response, error) -> () in
            
            if error != nil {//请求失败了
                
                print(error)
                
                successBack(isSuccess: false)
                
                return
                
                
            }
            
            
            guard let dic = response as? [String : AnyObject] else {
                
                print("返回的数据有误  不是json类型的  无法转换")
                
                successBack(isSuccess: false)
                
                return
                
            }
            
            
            
            //这里 dic已经有值 并且是我们想要的类型
            //我们获取字典里面的值
            let name = dic["name"]
            let avatar_large = dic["avatar_large"]
            
            
            //将获取的用户名和头像存到模型中  然后存入归档中
            userAccount.name = name as? String
            userAccount.avatar_large = avatar_large as? String
            
            //将获取到的用户名和头像保存起来
            let result = userAccount.saveUserAccount()
            
            if result {//如果保存成功  那么就说明已经登录进去了
                
                successBack(isSuccess: true)
                
                
            }else { //保存失败 那么就登录失败了  因为登录成功那么我们就一定能获取到用户名和头像
                
                successBack(isSuccess: false)
                
            }
            
//            print(userAccount)
            
        }
        
        
    }
    

    
    
    
}
